<?php

namespace app\index\controller;

use think\Db;
use app\admin\controller\Base;
use app\index\controller\Api;
use think\Validate;

class Index extends Base
{

    /**
     * 页面
     */

    // 首页
    public function index()
    {
        // 学科
        $course = Api::course();
        // 页面赋值
        $this->assign('course', $course);
        // 获取配置信息
        $data = DB::table('v1_config')->where('id', 1)->find();
        $this->assign('cof', $data);
        // 载入视图
        return view("/index");
    }

    // 资源下载
    public function downasset()
    {
        // 查询打包文件
        $pack = DB::table('v1_pack')->where('pack_id', input('pid'))->find();
        // 验证下载状态
        if ($pack && input('key') == $pack['pack_down_key'] && session(ISLOGIN) && session(USERPOWER) < 3) {
            //下载的zip文件名称
            $downname = $pack['pack_file_path'];
            //需要下载zip所存放的目录
            $file_name = ZIPPATH . $downname;

            // 判断文件是否存在
            if (!file_exists($file_name)) {
                exit("资源已被删除或不存在");
            }

            $fp = fopen($file_name, "r");
            //获取文件的字节
            $file_size = filesize($file_name);
            // 下载文件需要用到的头
            Header("Content-type: application/octet-stream");
            Header("Accept-Ranges: bytes");
            Header("Accept-Length:" . $file_size);
            Header("Content-Disposition: attachment; filename=$downname");
            //设置一次读取的字节数，每读取一次，就输出数据（即返回给浏览器） 
            $buffer = 1024;
            $file_count = 0; //读取的总字节数 
            while (!feof($fp) && $file_count < $file_size) {
                $file_con = fread($fp, $buffer);
                $file_count += $buffer;
                echo $file_con;
            }
            fclose($fp);
            DB::table('v1_pack')->where('pack_id', input('pid'))->setInc('pack_down_count');
        } else {
            exit("无权访问");
        }
    }

    // 资源处理
    public function asset()
    {
        try {
            // 必须登录才能操作
            if (session(ISLOGIN) && session(USERPOWER) < 3) {
                // 支持直接显示图片类型
                $ext = ['jpg', 'png', 'gif', 'jpeg'];
                // 如果是图片直接显示 否则下载
                if (in_array(input('ext'), $ext)) {
                    return  $this->showImg();
                } else {
                    return $this->packDown();
                }
            } else {
                exit("无权查看");
            }
        } catch (\Exception $e) {
            exit("资源不存在或已删除");
        }
        exit("测");
    }

    // 显示图片
    public function showImg()
    {
        try {
            // 获取资源路径
            $path = ASSET .  Api::getAnnex();
            // dd($path);
            $size = getimagesize($path); //获取mime信息
        } catch (\Exception $e) {
            $path = EXTEND . 'error.jpg';
            $size = getimagesize($path); //获取mime信息
        }
        $fp = fopen($path, "rb"); //二进制方式打开文件
        if ($size && $fp) {
            header("Content-type: {$size['mime']}");
            fpassthru($fp); // 输出至浏览器
            exit;
        }
    }

    // 打包并下载
    public function packDown()
    {
        // 查询资源
        $annex = Db::table('v1_task_annex')->where("task_annex_id", input('aid'))->find();
        // 资源是否存在
        if ($annex) {
            // 在此之前你的项目目录中必须新建一个空的zip包（必须存在）
            $file_template = EXTEND . 'pack.zip';
            //下载的zip文件名称
            $downname = $annex['task_annex_name'];
            //需要下载zip所存放的目录
            $file_name = ASSET . $annex['task_annex_path'];
            $fp = fopen($file_name, "r");
            //获取文件的字节
            $file_size = filesize($file_name);
            // 下载文件需要用到的头
            Header("Content-type: application/octet-stream");
            Header("Accept-Ranges: bytes");
            Header("Accept-Length:" . $file_size);
            Header("Content-Disposition: attachment; filename=$downname");
            //设置一次读取的字节数，每读取一次，就输出数据（即返回给浏览器） 
            $buffer = 1024;
            $file_count = 0; //读取的总字节数 
            while (!feof($fp) && $file_count < $file_size) {
                $file_con = fread($fp, $buffer);
                $file_count += $buffer;
                echo $file_con;
            }
            fclose($fp);
        } else {
            exit("资源不存在或已删除");
        }
    }

    /**
     * 不存在页面显示内容
     */
    public function miss()
    {
        return '';
    }

    /**
     * 接口
     */

    // 获取作业接口
    public function getTask()
    {
        // 作业
        $task = APi::task(input('cid'));
        $data = [
            "code" => 200,
            "data" => $task ? $task : [],
            "msg" => "成功"
        ];
        // 返回数据
        return json($data);
    }

    // 上传作业接口
    public function saveTask()
    {
        // 获取请求信息
        $request = $this->request;
        // 获取作业文件
        $file = request()->file('file');
        // 判断是否选择上传文件
        if ($file) {
            $validate = new Validate([
                'taskId' => 'require',
                'courseId' => 'require',
                'studentNo' => 'require'
            ], [
                'taskId.require' => '请选择作业',
                'courseId.require' => '请选择学科',
                'studentNo.require' => '请输入个人学号',
            ]);
            // 判断验证是否通过
            if (!$validate->check($request->post())) {
                // 表单验证失败
                return json($this->initTips(100, $validate->getError()));
            } else {
                Db::startTrans(); //开启事务
                try {
                    // 验证提交
                    $user = Api::isSave();
                    // 获取当前学科存放目录
                    $course_path = DB::table('v1_course')->where('course_id', $request->post('courseId'))->value('course_path');
                    // 判断是否存在
                    if (!$course_path) {
                        return json($this->initTips(400, '当前科目未设置作业存放位置，请联系管理员设置'));
                    }
                    // 获取上传格式
                    $task =  DB::table('v1_task')->where('task_id', $request->post('taskId'))->value('task_suffix');
                    if (!$task) {
                        return json($this->initTips(400, '作业不存在'));
                    }
                    // 作业存放位置
                    $updatePath = ASSET . $course_path . '/' . $request->post('taskId');
                    // 上传验证
                    $file_val = [];
                    // 设置上传限制
                    if ($task != '*') {
                        // 允许上传格式
                        $file_val['ext'] = $task;
                    }
                    // 获取上传文件路径
                    $info = $file->validate($file_val)->rule('getPath')->move($updatePath);
                    // 判断文件上传
                    if ($info) {
                        // 附件名称
                        $annexName = $info->getFilename();
                        // 附件路径
                        $annexPath = $course_path . '/' . $request->post('taskId') . '/' . $info->getSaveName();
                        // 附件类型
                        $annexExt = $info->getExtension();
                    } else {
                        return json($this->initTips(100, $file->getError()));
                    }
                    $record =  DB::table('v1_task_record')
                        ->where('course_id', input('courseId'))
                        ->where('task_id', input('taskId'))
                        ->where('student_id', $user['student_id'])
                        ->find();
                    // 作业记录不存在则添加
                    if (!$record) {
                        // 提交数据
                        $data = [
                            'student_id' => $user['student_id'],
                            'task_id' => input('taskId'),
                            'course_id' => input('courseId'),
                            'task_record_state' => 1,
                        ];
                        $rid =  DB::table('v1_task_record')->insertGetId($data);
                        $res = $rid;
                    } else {
                        // 提交数据
                        $data = [
                            'task_record_state' => 1,
                        ];
                        $rid =  $record['task_record_id'];
                        // 更新作业状态
                        $res =  DB::table('v1_task_record')
                            ->where('task_record_id', $rid)
                            ->update($data);
                    }

                    if ($res >= 0) {
                        // 附件提交数据
                        $annex = [
                            'task_annex_name' => $annexName,
                            'task_annex_path' => $annexPath,
                            'task_annex_ext' => $annexExt,
                            'task_record_id' => $rid,
                        ];
                        // 保存附件信息
                        if (Api::saveAnnex($annex)) {
                            // 事务提交
                            Db::commit();
                            return json($this->initTips(200, "作业提交成功"));
                        } else {
                            // 事务回滚
                            Db::rollback();
                            return json($this->initTips(400, '作业保存失败'));
                        }
                    } else {
                        // 事务回滚
                        Db::rollback();
                        return json($this->initTips(400, '作业提交失败'));
                    }
                } catch (\Exception $ee) {
                    // 事务回滚
                    Db::rollback();
                    // 返回异常信息
                    return json($this->initTips(500));
                }
            }
        } else {
            return json($this->initTips(100, '请选择作业上传文件'));
        }
    }

    public function hello($name = 'ThinkPHP5')
    {
        return 'hello,' . $name;
    }
}
